package com.study.example.ex01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

/**
* @Name: FileCopyDemo
* @Description: 复制文本文件的五中方式练习
* 说明：
* 	复制文本文件
* 		分析：
* 			复制数据时，若使用记事本打开可以读懂，使用字符流，否则使用字节流；
* 			即复制文本文件，采用字符流的方式实现，总共有5中方法可以实现。
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-16 上午10:08:36 
* @Version: V1.0
 */
public class FileCopyDemo {
	
	/**
	* @Name: fileCopy01
	* @Description: 使用字符转换流（一次读取一个字节）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午10:12:25
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy01() throws IOException {
		InputStreamReader reader = new InputStreamReader(new FileInputStream("fos.txt")) ;
		OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("copy.txt")) ;
		//一次读取一个字符
		int c = 0 ;
		while((c = reader.read()) != -1) {
			writer.write(c) ;
		}
		reader.close() ;
		writer.close() ;
	}
	
	/**
	* @Name: fileCopy02
	* @Description: 使用字符转换流（一次读取一个字节数组）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午10:13:08
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy02() throws IOException {
		InputStreamReader reader = new InputStreamReader(new FileInputStream("fos.txt")) ;
		OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("copy.txt")) ;
		//一次读取一个字符数组
		char[] cbuf = new char[1024] ;
		int len = 0 ;
		while((len = reader.read(cbuf)) != -1) {
			writer.write(cbuf, 0, len) ;
			writer.flush() ;
		}
		reader.close() ;
		writer.close() ;
	}
	
	/**
	* @Name: fileCopy03
	* @Description: 使用文件字符流（一次读取一个字节）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午10:12:25
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy03() throws IOException {
		FileReader reader = new FileReader("fos.txt") ;
		FileWriter writer = new FileWriter("copy.txt") ;
		//一次读取一个字符
		int c = 0 ;
		while((c = reader.read()) != -1) {
			writer.write(c) ;
		}
		reader.close() ;
		writer.close() ;
	}
	
	/**
	* @Name: fileCopy04
	* @Description: 使用文件字符流（一次读取一个字节数组）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午10:13:37
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy04() throws IOException {
		FileReader reader = new FileReader("fos.txt") ;
		FileWriter writer = new FileWriter("copy.txt") ;
		//一次读取一个字符数组
		char[] cbuf = new char[1024] ;
		int len = 0 ;
		while((len = reader.read(cbuf)) != -1) {
			writer.write(cbuf, 0, len) ;
			writer.flush() ;
		}
		reader.close() ;
		writer.close() ;
	}
	
	/**
	* @Name: fileCopy05
	* @Description: 使用高效字符流（一次读取一个数据行）
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-16 上午10:13:48
	* @Parameters: @throws IOException
	* @Return: void
	 */
	@Test
	public void fileCopy05() throws IOException {
		BufferedReader reader = new BufferedReader(new FileReader("fos.txt")) ;
		BufferedWriter writer = new BufferedWriter(new FileWriter("copy.txt")) ;
		//一次读取一个数据行
		String line = null ;
		while((line = reader.readLine()) != null) {
			writer.write(line) ;
			writer.newLine() ;
			writer.flush() ;
		}
		reader.close() ;
		writer.close() ;
	}

}
